<?php
require_once(realpath(DOCUMENT_ROOT) . PROJECT_BASE . ENUMPATH . 'Enum.php');

/**
 * Aufzählung der Tile Implementationsarten.
 * @access public
 * @author mroesler
 */
class TileEnum extends Enum
{
    /**
     * Grass Tile
     * @access public
     * @var int
     */
    const GRASS = 1;

    /**
     * Coin Tile
     * @access public
     * @var int
     */
    const COIN = 2;

    /**
     * Rock Tile
     * @access public
     * @var int
     */
    const ROCK = 3;

    /**
     * Prüfe, ob ein Schlüssel tatsächlich als Konstantenwert existiert.
     * Diese statische Methode sollte immer mit den Definitionen der
     * Konstanten konsistent gehalten werden.
     * @access private
     * @param int key
     * @ParamType key int
     * @return boolean
     * @ReturnType boolean
     */
    private static function exists($key) {
        switch ($key) {
            case self::GRASS :
            case self::COIN :
            case self::ROCK :
                return true;
                break;
            default :
                return false;
                break;
        }
    }

    /**
     * @access public
     * @param int key
     * @ParamType key int
     * @throws InvalidArgumentException
     */
    public function __construct($key) {
        if (!self::exists($key)) {
            // LogicException
            throw new Exception("\$key does not exist ({$key})");
        }
        $this->set($key);
    }

    /**
     * Gibt den Implementations-Code des Tile zurück.
     * @return string
     * @ReturnType string
     * @throws UnexpectedValueException
     */
    public function code() {
        switch ($this->_key) {
            case self::GRASS :
                return "Grass";
                break;
            case self::COIN :
                return "Coin";
                break;
            case self::ROCK :
                return "Rock";
                break;
            default:
				// RuntimeException
				throw new Exception($this->_key);
				break;
		}
	}

	/**
	 * Gibt Beschreibung des DBLayers zurück
	 * @return string
	 * @ReturnType string
	 * @throws UnexpectedValueException
	 */
	public function description() {
		switch ($this->_key) {
			case self::GRASS :
				return "GrassTile Implementation";
				break;
			case self::COIN :
				return "CoinTile Implementation";
				break;
			case self::ROCK :
			    return "RockTile Implementation";
			    break;
			default :
				// RuntimeException
				throw new Exception($this->_key);
				break;
		}
	}

	/**
	 * Gib String-Repräsentation des DB-Layers zurück.
	 * @return string
	 * @ReturnType string
	 * @throws UnexpectedValueException
	 */
	public function __toString() {
		return $this->description();
	}
}
?>